1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package com.google.common.collect;
16
17 import static com.google.common.truth.Truth.assertThat;
18
19 import com.google.common.annotations.GwtCompatible;
20 import com.google.common.base.Optional;
21
22 import junit.framework.TestCase;
23
24 import java.util.Arrays;
25 import java.util.List;
26
27 import javax.annotation.Nullable;
28
29
30
31
32
33
34 @GwtCompatible(emulated = true)
35 public class TreeTraverserTest extends TestCase {
36 private static final class Tree {
37 final char value;
38 final List<Tree> children;
39
40 public Tree(char value, Tree... children) {
41 this.value = value;
42 this.children = Arrays.asList(children);
43 }
44 }
45
46 private static final class BinaryTree {
47 final char value;
48 @Nullable
49 final BinaryTree left;
50 @Nullable
51 final BinaryTree right;
52
53 private BinaryTree(char value, BinaryTree left, BinaryTree right) {
54 this.value = value;
55 this.left = left;
56 this.right = right;
57 }
58 }
59
60 private static final TreeTraverser<Tree> ADAPTER = new TreeTraverser<Tree>() {
61 @Override
62 public Iterable<Tree> children(Tree node) {
63 return node.children;
64 }
65 };
66
67 private static final BinaryTreeTraverser<BinaryTree> BIN_ADAPTER =
68 new BinaryTreeTraverser<BinaryTree>() {
69
70 @Override
71 public Optional<BinaryTree> leftChild(BinaryTree node) {
72 return Optional.fromNullable(node.left);
73 }
74
75 @Override
76 public Optional<BinaryTree> rightChild(BinaryTree node) {
77 return Optional.fromNullable(node.right);
78 }
79 };
80
81
82
83
84
85
86
87
88 static final Tree a = new Tree('a');
89 static final Tree b = new Tree('b');
90 static final Tree c = new Tree('c');
91 static final Tree d = new Tree('d', a, b, c);
92 static final Tree e = new Tree('e');
93 static final Tree f = new Tree('f');
94 static final Tree g = new Tree('g', f);
95 static final Tree h = new Tree('h', d, e, g);
96
97
98
99
100
101
102
103
104 static final BinaryTree ba = new BinaryTree('a', null, null);
105 static final BinaryTree bc = new BinaryTree('c', null, null);
106 static final BinaryTree bb = new BinaryTree('b', ba, bc);
107 static final BinaryTree bg = new BinaryTree('g', null, null);
108 static final BinaryTree bf = new BinaryTree('f', bg, null);
109 static final BinaryTree be = new BinaryTree('e', null, bf);
110 static final BinaryTree bd = new BinaryTree('d', bb, be);
111
112 static String iterationOrder(Iterable<Tree> iterable) {
113 StringBuilder builder = new StringBuilder();
114 for (Tree t : iterable) {
115 builder.append(t.value);
116 }
117 return builder.toString();
118 }
119
120 static String binaryIterationOrder(Iterable<BinaryTree> iterable) {
121 StringBuilder builder = new StringBuilder();
122 for (BinaryTree t : iterable) {
123 builder.append(t.value);
124 }
125 return builder.toString();
126 }
127
128 public void testPreOrder() {
129 assertThat(iterationOrder(ADAPTER.preOrderTraversal(h))).isEqualTo("hdabcegf");
130 assertThat(binaryIterationOrder(BIN_ADAPTER.preOrderTraversal(bd))).isEqualTo("dbacefg");
131 }
132
133 public void testPostOrder() {
134 assertThat(iterationOrder(ADAPTER.postOrderTraversal(h))).isEqualTo("abcdefgh");
135 assertThat(binaryIterationOrder(BIN_ADAPTER.postOrderTraversal(bd))).isEqualTo("acbgfed");
136 }
137
138 public void testBreadthOrder() {
139 assertThat(iterationOrder(ADAPTER.breadthFirstTraversal(h))).isEqualTo("hdegabcf");
140 assertThat(binaryIterationOrder(BIN_ADAPTER.breadthFirstTraversal(bd))).isEqualTo("dbeacfg");
141 }
142
143 public void testInOrder() {
144 assertThat(binaryIterationOrder(BIN_ADAPTER.inOrderTraversal(bd))).isEqualTo("abcdegf");
145 }
146 }
147